using System;
using System.Collections.Generic;
using UD.GRAL.Entity;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data.Common;
using System.Data;
using UD.Utilities.Exceptions;

namespace UD.GRAL.DataAccess
{
    public class DepartamentoDAL : GeneralDAL
    {
        public DepartamentoDAL()
        {
        }
        public int InsertarDepartamento(Departamento pDepartamento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Departamento_Insertar"))
                {
                    int vResultado;
                    vDataBase.AddOutParameter(vDbCommand, "@IdDepartamento", DbType.Int32, 18);
                    vDataBase.AddInParameter(vDbCommand, "@IdPais", DbType.Int32, pDepartamento.IdPais);
                    vDataBase.AddInParameter(vDbCommand, "@CodDepartamento", DbType.String, pDepartamento.CodDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@NombreDepartamento", DbType.String, pDepartamento.NombreDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pDepartamento.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioCrea", DbType.String, pDepartamento.UsuarioCrea);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    pDepartamento.IdDepartamento = Convert.ToInt32(vDataBase.GetParameterValue(vDbCommand, "@IdDepartamento").ToString());
                    GenerarLogAuditoria(pDepartamento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int ModificarDepartamento(Departamento pDepartamento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Departamento_Modificar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdDepartamento", DbType.Int32, pDepartamento.IdDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@IdPais", DbType.Int32, pDepartamento.IdPais);
                    vDataBase.AddInParameter(vDbCommand, "@CodDepartamento", DbType.String, pDepartamento.CodDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@NombreDepartamento", DbType.String, pDepartamento.NombreDepartamento);
                    vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pDepartamento.Estado);
                    vDataBase.AddInParameter(vDbCommand, "@UsuarioModifica", DbType.String, pDepartamento.UsuarioModifica);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pDepartamento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }
        public int EliminarDepartamento(Departamento pDepartamento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Departamento_Eliminar"))
                {
                    int vResultado;
                    vDataBase.AddInParameter(vDbCommand, "@IdDepartamento", DbType.Int32, pDepartamento.IdDepartamento);
                    vResultado = vDataBase.ExecuteNonQuery(vDbCommand);
                    GenerarLogAuditoria(pDepartamento, vDbCommand);
                    return vResultado;
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                 throw new GenericException(ex);
            }
        }


        public Departamento ConsultarDepartamento(int pIdDepartamento)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Departamento_Consultar"))
                {
                    vDataBase.AddInParameter(vDbCommand, "@IdDepartamento", DbType.Int32, pIdDepartamento);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        Departamento vDepartamento = new Departamento();
                        while (vDataReaderResults.Read())
                        {
                            vDepartamento.IdDepartamento = vDataReaderResults["IdDepartamento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdDepartamento"].ToString()) : vDepartamento.IdDepartamento;
                            vDepartamento.IdPais = vDataReaderResults["IdPais"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdPais"].ToString()) : vDepartamento.IdPais;
                            vDepartamento.CodDepartamento = vDataReaderResults["CodDepartamento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodDepartamento"].ToString()) : vDepartamento.CodDepartamento;
                            vDepartamento.NombreDepartamento = vDataReaderResults["NombreDepartamento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreDepartamento"].ToString()) : vDepartamento.NombreDepartamento;
                            vDepartamento.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vDepartamento.Estado;
                            vDepartamento.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vDepartamento.UsuarioCrea;
                            vDepartamento.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vDepartamento.FechaCrea;
                            vDepartamento.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vDepartamento.UsuarioModifica;
                            vDepartamento.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vDepartamento.FechaModifica;
                        }
                        return vDepartamento;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }

        public List<Departamento> ConsultarDepartamentos(String pCodDepartamento, String pNombreDepartamento, Boolean? pEstado)
        {
            try
            {
                Database vDataBase = ObtenerInstancia();
                using (DbCommand vDbCommand = vDataBase.GetStoredProcCommand("usp_SYSEXTUD_GRAL_Departamentos_Consultar"))
                {
                    if(pCodDepartamento != null)
                         vDataBase.AddInParameter(vDbCommand, "@CodDepartamento", DbType.String, pCodDepartamento);
                    if(pNombreDepartamento != null)
                         vDataBase.AddInParameter(vDbCommand, "@NombreDepartamento", DbType.String, pNombreDepartamento);
                    if(pEstado != null)
                         vDataBase.AddInParameter(vDbCommand, "@Estado", DbType.Boolean, pEstado);
                    using (IDataReader vDataReaderResults = vDataBase.ExecuteReader(vDbCommand))
                    {
                        List<Departamento> vListaDepartamento = new List<Departamento>();
                        while (vDataReaderResults.Read())
                        {
                                Departamento vDepartamento = new Departamento();
                            vDepartamento.IdDepartamento = vDataReaderResults["IdDepartamento"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdDepartamento"].ToString()) : vDepartamento.IdDepartamento;
                            vDepartamento.IdPais = vDataReaderResults["IdPais"] != DBNull.Value ? Convert.ToInt32(vDataReaderResults["IdPais"].ToString()) : vDepartamento.IdPais;
                            vDepartamento.CodDepartamento = vDataReaderResults["CodDepartamento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["CodDepartamento"].ToString()) : vDepartamento.CodDepartamento;
                            vDepartamento.NombreDepartamento = vDataReaderResults["NombreDepartamento"] != DBNull.Value ? Convert.ToString(vDataReaderResults["NombreDepartamento"].ToString()) : vDepartamento.NombreDepartamento;
                            vDepartamento.Estado = vDataReaderResults["Estado"] != DBNull.Value ? Convert.ToBoolean(vDataReaderResults["Estado"].ToString()) : vDepartamento.Estado;
                            vDepartamento.UsuarioCrea = vDataReaderResults["UsuarioCrea"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioCrea"].ToString()) : vDepartamento.UsuarioCrea;
                            vDepartamento.FechaCrea = vDataReaderResults["FechaCrea"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaCrea"].ToString()) : vDepartamento.FechaCrea;
                            vDepartamento.UsuarioModifica = vDataReaderResults["UsuarioModifica"] != DBNull.Value ? Convert.ToString(vDataReaderResults["UsuarioModifica"].ToString()) : vDepartamento.UsuarioModifica;
                            vDepartamento.FechaModifica = vDataReaderResults["FechaModifica"] != DBNull.Value ? Convert.ToDateTime(vDataReaderResults["FechaModifica"].ToString()) : vDepartamento.FechaModifica;
                                vListaDepartamento.Add(vDepartamento);
                        }
                        return vListaDepartamento;
                    }
                }
            }
            catch (UserInterfaceException)
            {
                throw;
            }
            catch (Exception ex)
            {
                throw new GenericException(ex);
            }
        }
    }
}
